<?php
namespace app\common\model;

use think\facade\Db;

class CommonModel extends \think\Model
{
    /**
     * 添加一条数据
     * @author 贺强
     * @time   2019-05-17 09:27:35
     * @param array   $data     要添加的数据 ['name'=>'think', 'sex'=>'男', ……]
     * @param array   $field    字段合法性检测
     * @param boolean $fetchSql 是否打印SQL语句
     */
    public static function add($data, $field = [], $fetchSql = false)
    {
        if (empty($data['ctime'])) {
            $data['ctime'] = time();
        }
        $model = Db::table(static::$tablename);
        if (!empty($field)) {
            $model = $model->field($field);
        }
        if (!empty($fetchSql)) {
            $model = $model->fetchSql($fetchSql);
        }
        $id = $model->insertGetId($data);
        if ($id === 0) {
            $id = true;
        }
        return $id;
    }

    /**
     * 添加多条数据
     * @author 贺强
     * @time   2019-05-17 09:33:09
     * @param array   $data     要添加的数据 [['name'=>'think', 'sex'=>'男', ……], ['name'=>'think', 'sex'=>'男', ……], ……]
     * @param integer $limit    每次插入的数量限制
     * @param boolean $fetchSql 是否打印SQL语句
     */
    public static function addArr($data, $limit = 0, $fetchSql = false)
    {
        foreach ($data as &$item) {
            if (empty($item['ctime'])) {
                $item['ctime'] = time();
            }
        }
        $model = Db::table(static::$tablename);
        if (!empty($limit)) {
            $model = $model->limit($limit);
        }
        if (!empty($fetchSql)) {
            $model = $model->fetchSql($fetchSql);
        }
        $num = $model->insertAll($data);
        return $num;
    }

    /**
     * 根据主键ID删除
     * @author 贺强
     * @time   2019-05-17 09:50:52
     * @param int|array $id       要删除的主键ID，1或[1, 2, 3, ……]
     * @param boolean   $fetchSql 是否打印SQL语句
     * @return integer           返回影响的行数
     */
    public static function delById($id, $fetchSql = false)
    {
        $model = Db::table(static::$tablename);
        if (!empty($fetchSql)) {
            $model = $model->fetchSql($fetchSql);
        }
        $num = $model->delete($id);
        return $num;
    }

    /**
     * 根据条件删除数据
     * @author 贺强
     * @time   2019-05-17 11:18:26
     * @param array|string $where    删除条件，[['id','>', 3],……]或SQL字符串
     * @param boolean      $fetchSql 是否打印SQL语句
     * @return integer                 返回影响行数
     */
    public static function delByWhere($where, $fetchSql = false)
    {
        $model = Db::table(static::$tablename);
        if (!empty($where)) {
            $model = $model->where($where);
        }
        if (!empty($fetchSql)) {
            $model = $model->fetchSql($fetchSql);
        }
        $num = $model->delete();
        return $num;
    }

    /**
     * 根据条件修改数据
     * @author 贺强
     * @time   2019-05-17 11:21:13
     * @param array        $data     要修改的数据 ['login_time'  => ['exp','now()'], 'name' => 'thinkphp', ……]
     * @param array|string $where    修改条件 [['id','>', 3],……]或SQL字符串
     * @param boolean      $fetchSql 是否打印SQL语句
     * @return integer                 返回影响的行数
     */
    public static function modify($data, $where = '', $limit = null, $fetchSql = false)
    {
        if (empty($data['mtime'])) {
            $data['mtime'] = time();
        }
        $model = Db::table(static::$tablename);
        if (!empty($where)) {
            $model = $model->where($where);
        }
        if (!empty($limit)) {
            $model = $model->limit($limit);
        }
        if (!empty($fetchSql)) {
            $model = $model->fetchSql($fetchSql);
        }
        $num = $model->update($data);
        return $num;
    }

    /**
     * 根据条件更新某个字段的值
     * @author 贺强
     * @time   2019-05-17 11:24:41
     * @param string       $field    要更新的字段名
     * @param string       $value    要更新的字段值
     * @param array|string $where    条件 [['id','>', 3],……]或SQL字符串
     * @param boolean      $fetchSql 是否打印SQL语句
     * @return integer                 返回影响的行数
     */
    public static function modifyField($field, $value, $where = '', $fetchSql = false)
    {
        $model = Db::table(static::$tablename);
        if (!empty($where)) {
            $model = $model->where($where);
        }
        if (!empty($fetchSql)) {
            $model = $model->fetchSql($fetchSql);
        }
        $num = $model->setField($field, $value);
        return $num;
    }

    /**
     * 根据条件自增某字段的值
     * @author 贺强
     * @time   2019-05-17 11:28:15
     * @param string       $field    要自增的字段
     * @param array|string $where    条件 [['id','>', 3],……]或SQL字符串
     * @param integer      $value    自增量
     * @param boolean      $fetchSql 是否打印SQL语句
     * @return integer                 返回影响的行数
     */
    public static function increment($field, $where = [], $value = 1, $fetchSql = false)
    {
        if (empty($value)) {
            $value = 1;
        }
        if (empty($delay)) {
            $delay = 0;
        }
        $num = Db::table(static::$tablename)
            ->where($where)
            ->inc($field, $value)
            ->fetchSql($fetchSql)
            ->update();
        return $num;
    }

    /**
     * 根据条件自减某字段值
     * @author 贺强
     * @time   2019-05-17 11:31:24
     * @param string       $field    要自减的字段
     * @param array|string $where    条件 [['id','>', 3],……]或SQL字符串
     * @param integer      $value    自减量
     * @param integer      $delay    延迟更新的秒数
     * @param boolean      $fetchSql 是否打印SQL语句
     * @return integer                 返回影响的行数
     */
    public static function decrement($field, $where = [], $value = 1, $fetchSql = false)
    {
        if (empty($value)) {
            $value = 1;
        }
        if (empty($delay)) {
            $delay = 0;
        }
        $num = Db::table(static::$tablename)
            ->where($where)
            ->dec($field, $value)
            ->fetchSql($fetchSql)
            ->update();
        return $num;
    }

    /**
     * 根据条件获取某一列的值
     * @author 贺强
     * @time   2019-05-28 15:30:02
     * @param string       $field    要获取的字段名
     * @param array|string $where    条件 [['id','=',1],……]或SQL字符串
     * @param integer      $limit    查询多少条
     * @param boolean      $fetchSql 是否打印SQL语句
     * @return array                    返回某字段值的数组
     */
    public static function getField($field, $where = [], $limit = null, $fetchSql = false)
    {
        $model = Db::table(static::$tablename);
        if (!empty($where)) {
            $model = $model->where($where);
        }
        if (!empty($limit)) {
            $model = $model->limit($limit);
        }
        if (!empty($fetchSql)) {
            $model = $model->fetchSql($fetchSql);
        }
        $column = $model->column($field);
        return $column;
    }

    /**
     * 根据条件获取某一列符合条件的第一条值
     * @author 贺强
     * @time   2019-06-01 14:45:27
     * @param string       $field    列名
     * @param array|string $where    条件 [['id','=',1],……]或SQL字符串
     * @param string       $order    按某(些)字段排序 ['id'=>'desc']或'id desc'
     * @param boolean      $fetchSql 是否打印 SQL 语句
     * @return string       返回获取的值
     */
    public static function getFieldValue($field, $where = [], $order = '', $fetchSql = false)
    {
        $model = Db::table(static::$tablename);
        if (!empty($where)) {
            $model = $model->where($where);
        }
        if (!empty($order)) {
            $model = $model->order($order);
        }
        if (!empty($fetchSql)) {
            $model = $model->fetchSql($fetchSql);
        }
        $value = $model->value($field);
        return $value;
    }

    /**
     * 根据条件获取总数量
     * @author 贺强
     * @time   2019-05-17 11:35:19
     * @param array|string $where    条件 [['id','>', 3],……]或SQL字符串
     * @param string       $field    要统计数量的字段
     * @param string       $group    对结果进行分组
     * @param boolean      $fetchSql 是否打印SQL语句
     * @return integer                 返回总数量
     */
    public static function getCount($where = '', $field = '*', $group = '', $fetchSql = false)
    {
        $model = Db::table(static::$tablename);
        if (empty($field)) {
            $field = '*';
        }
        if (!empty($where)) {
            $model = $model->where($where);
        }
        if (!empty($group)) {
            $model = $model->group($group);
        }
        if (!empty($fetchSql)) {
            $model = $model->fetchSql($fetchSql);
        }
        $count = $model->count($field);
        return $count;
    }

    /**
     * 根据条件查询一条数据
     * @author 贺强
     * @time   2019-05-17 11:37:39
     * @param array|string  $where    条件 [['id','>', 3],……]或SQL字符串
     * @param array|boolean $field    要查询的字段
     * @param string        $order    按某(些)字段排序 ['id'=>'desc']或'id desc'
     * @param boolean       $lock     是否加锁
     * @param boolean       $fetchSql 是否打印SQL语句
     * @return array                   返回查询结果
     */
    public static function getModel($where = '', $field = true, $order = null, $lock = false, $fetchSql = false)
    {
        $model = Db::table(static::$tablename);
        if (!empty($order)) {
            $model = $model->order($order);
        }
        if (!empty($where)) {
            $model = $model->where($where);
        }
        if (!empty($field)) {
            $model = $model->field($field);
        }
        if (!empty($lock)) {
            $model = $model->lock($lock);
        }
        if (!empty($fetchSql)) {
            $model = $model->fetchSql($fetchSql);
        }
        $data = $model->find();
        return $data;
    }

    /**
     * 根据条件查询数据集
     * @author 贺强
     * @time   2019-05-17 11:42:16
     * @param array|string  $where    条件 [['id','>', 3],……]或SQL字符串
     * @param array|boolean $field    要查询的字段
     * @param string        $page     分页查询 '1,10' 页码和每页条数
     * @param array|string  $order    按某(些)字段排序 ['id'=>'desc']或'id desc'
     * @param string        $group    对结果集进行分组
     * @param string        $having   配合group使用的聚合筛选条件
     * @param boolean       $fetchSql 是否打印SQL语句
     * @return array                   返回查询结果(数组)
     */
    public static function getList($where = null, $field = true, $page = null, $order = null, $group = null, $having = null, $fetchSql = false)
    {
        $model = Db::table(static::$tablename)->field($field);
        if (is_array($page)) {
            $model = $model->page($page[0], $page[1]);
        } elseif (is_int($page)) {
            $model = $model->page($page);
        }
        if (!empty($where)) {
            $model = $model->where($where);
        }
        if (!empty($order)) {
            $model = $model->order($order);
        }
        if (!empty($group)) {
            $model = $model->group($group);
        }
        if (!empty($having)) {
            $model = $model->having($having);
        }
        if ($fetchSql) {
            return $model->fetchSql(true)->select();
        }
        $list = $model->select()->toArray();
        return $list;
    }

    /**
     * 根据条件查询数据集
     * @author 贺强
     * @time   2019-05-17 11:49:11
     * @param array|string  $where    条件 [['id','>', 3],……]或SQL字符串
     * @param array|boolean $field    要查询的字段
     * @param string        $limit    分页查询 '1,10' 从哪一条开始查多少条件
     * @param array|string  $order    按某(些)字段排序 ['id'=>'desc']或'id desc'
     * @param string        $group    对查询结果进行分组
     * @param string        $having   配合group使用的聚合筛选条件
     * @param boolean       $fetchSql 是否打印SQL语句
     * @return array                   返回查询结果集
     */
    public static function getLimitList($where, $field = true, $limit = 0, $order = 'id', $group = '', $having = '', $fetchSql = false)
    {
        $model = Db::table(static::$tablename);
        if (empty($field)) {
            $field = true;
        }
        $model = $model->field($field);
        if (!empty($where)) {
            $model = $model->where($where);
        }
        if (!empty($limit)) {
            $model = $model->limit($limit);
        }
        if (!empty($order)) {
            $model = $model->order($order);
        }
        if (!empty($group)) {
            $model = $model->group($group);
        }
        if (!empty($having)) {
            $model = $model->having($having);
        }
        if (!empty($fetchSql)) {
            return $model->fetchSql(true)->select();
        }
        $list = $model->select()->toArray();
        return $list;
    }

    /**
     * 联合查询总数
     * @author 贺强
     * @time   2019-05-17 13:49:57
     * @param array        $join     联表查询[['think_card c','a.card_id=c.id'], ……]
     * @param array|string $where    条件 [['id','>', 3],……]或SQL字符串
     * @param string       $group    对查询结果进行分组
     * @param string       $having   配合group使用的聚合筛选条件
     * @param string       $alias    设置当前数据表的别名，默认为 a
     * @param boolean      $fetchSql 是否打印SQL语句
     * @return integer                 返回总数量
     */
    public static function getJoinCount($join, $where = '', $group = '', $having = '', $alias = 'a', $fetchSql = false)
    {
        $model = Db::table(static::$tablename)->alias($alias);
        if (count($join) == count($join, 1)) {
            $model = $model->join($join[0], $join[1]);
        } else {
            foreach ($join as $item) {
                $model = $model->join($item[0], $item[1]);
            }
        }
        if (!empty($where)) {
            $model = $model->where($where);
        }
        if (!empty($group)) {
            $model = $model->group($group);
        }
        if (!empty($having)) {
            $model = $model->having($having);
        }
        if (!empty($fetchSql)) {
            $model = $model->fetchSql($fetchSql);
        }
        $count = $model->count();
        return $count;
    }

    /**
     * 联表查询
     * @author 贺强
     * @time   2019-05-17 13:54:07
     * @param array         $join     联表查询 [['think_card c','a.card_id=c.id'], ……]
     * @param array|string  $where    条件 [['id','>', 3],……]或SQL字符串
     * @param array|boolean $field    要查询的字段
     * @param string        $page     分页查询 '1,10' 页码和每页多少条
     * @param array|string  $order    按某(些)字段排序 ['id'=>'desc']或'id desc'
     * @param string        $group    对查询结果进行分组
     * @param string        $having   配合group使用的聚合筛选条件
     * @param string        $alias    设置当前表的别名，默认为 a
     * @param boolean       $fetchSql 是否打印SQL语句
     * @return array                   返回查询结果集
     */
    public static function getJoinList($join, $where = '', $field = '*', $page = null, $order = '', $group = '', $having = '', $alias = 'a', $fetchSql = false)
    {
        $model = Db::table(static::$tablename)->alias($alias)->field($field);
        if (count($join) == count($join, 1)) {
            $model = $model->join($join[0], $join[1]);
        } else {
            foreach ($join as $item) {
                $model = $model->join($item[0], $item[1]);
            }
        }
        if (!empty($where)) {
            $model = $model->where($where);
        }
        if (is_array($page)) {
            $model = $model->page($page[0], $page[1]);
        } elseif (is_int($page)) {
            $model = $model->page($page);
        }
        if (!empty($order)) {
            $model = $model->order($order);
        }
        if (!empty($group)) {
            $model = $model->group($group);
        }
        if (!empty($having)) {
            $model = $model->having($having);
        }
        if (!empty($fetchSql)) {
            return $model->fetchSql(true)->select();
        }
        $list = $model->select()->toArray();
        return $list;
    }

    /**
     * 连表查询一条数据
     * @author 贺强
     * @time   2019-06-05 17:47:45
     * @param array        $join     联表查询 [['think_card c','a.card_id=c.id'], ……]
     * @param array|string $where    条件 [['id','>', 3],……]或SQL字符串
     * @param boolean      $field    要查询的字段
     * @param array|string $order    按某(些)字段排序 ['id'=>'desc']或'id desc'
     * @param string       $alias    表别名
     * @param boolean      $fetchSql 是否打印 SQL 语句
     * @return array                   返回查询结果
     */
    public static function getJoinModel($join, $where = '', $field = '*', $order = '', $alias = 'a', $fetchSql = false)
    {
        $model = Db::table(static::$tablename)->alias($alias)->field($field);
        if (count($join) == count($join, 1)) {
            $model = $model->join($join[0], $join[1]);
        } else {
            foreach ($join as $item) {
                $model = $model->join($item[0], $item[1]);
            }
        }
        if (!empty($where)) {
            $model = $model->where($where);
        }
        if (!empty($order)) {
            $model = $model->order($order);
        }
        if (!empty($fetchSql)) {
            $model = $model->fetchSql($fetchSql);
        }
        $data = $model->find();
        return $data;
    }

    /**
     * Union查询
     * @author 贺强
     * @time   2019-05-17 13:58:51
     * @param array         $union    联合的SQL语句 ['SELECT name FROM table1',……]
     * @param array|string  $where    条件 [['id','>', 3],……]或SQL字符串
     * @param array|boolean $field    要查询的字段
     * @param boolean       $is_all   是否是union all操作，默认不是
     * @param string        $alias    当前表别名，默认为 a
     * @param boolean       $fetchSql 是否打印SQL语句
     * @return array                   返回查询结果集
     */
    public static function getUnionList($union, $where = '', $field = true, $is_all = false, $alias = 'a', $fetchSql = false)
    {
        $model = Db::table(static::$tablename)->alias($alias)->field($field)->union($union, $is_all);
        if (!empty($where)) {
            $model = $model->where($where);
        }
        if (!empty($fetchSql)) {
            return $model->fetchSql(true)->select();
        }
        $list = $model->select()->toArray();
        return $list;
    }

    /**
     * 执行原生 SQL 查询
     * @author 贺强
     * @time   2016-11-16 15:55:46
     * @param string $sql 要执行的 SQL 语句
     * @return array       返回查询结果
     */
    public static function query($sql)
    {
        return Db::query($sql);
    }

    /**
     * 执行原生 SQL 增、删、改
     * @author 贺强
     * @time   2019-08-08 10:05:19
     * @param string $sql 要执行的 SQL 语句
     * @return integer      返回执行影响的行数
     */
    public static function execute($sql)
    {
        return Db::execute($sql);
    }
}
